/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head)
    {
        //放进空指针就直接返回空指针
        if (head == nullptr)
        {
            return nullptr;
        }
        ListNode* p = head;
        // ListNode* p1=new ListNode;
        // p1->next=head;
        // head=p1;
        while (p != nullptr)
        {
            
            //注意这里看似if和while同一个条件可以合并，但其实不行
            if (p->next != nullptr && p->val == p->next->val)//下一个不为空且这一个与下一个相等
            {
                while (p->val == p->next->val && p->next != nullptr)
                {
                    //下个相等，下下个又是空，直接抛弃后两个，直接本次指针指向空。
                    if (p->next->next == nullptr)
                    {
                        p->next = nullptr;
                        break;
                    }
                    else
                    {
                        //本次的指针指向下下个
                        p->next = p->next->next;
                    }
                }
                p->val = 101;//因为p值要在保证下一个不等的情况才给自身做标记，因此这个赋值只有一次，上面的if和while不能合并。
            }
           
        
            p = p->next;
        
        }
        //
        
        //哨兵节点指向head
        ListNode* p1 = new ListNode;
        p1->next=head;
        //保存这个p1
        ListNode* p2 = new ListNode;
        p2=p1;
        //注意尽管最后一般是返回p2->next，但是如果第一个就是重复数字，p1->next就会变化，因此不能一开始就记录p1->next,只能记录p1
        p=p1;

        while (p != nullptr)
        {
            if (p->next != nullptr && 101 == p->next->val)
            {
                while (101 == p->next->val && p->next != nullptr)
                {
                    if (p->next->next == nullptr)
                    {
                        p->next = nullptr;
                        break;
                    }
                    else
                    {
                        p->next = p->next->next;
                    }
                }
                
            }
           
            {
                p = p->next;
            }
        }
        if(p2->next!=nullptr)
        {
            return p2->next;
        }
        else
        {
            return nullptr;
        }
       
    }
};